﻿using System;
using System.Collections.Generic;
using System.Text;

namespace LibUpdate
{
    /// <summary>
    /// 升级总体控制器
    /// </summary>
    public class UpdateControl
    {

        //private int _FileIndex;
        //等待升级版本列表
        private Colophon _Colophon;
        //当前正在升级的版本
        private Version _Update_ver;
        private Down.DownControl downpro;
        private Action.ActionControl actionControl;

        //当前升级版本
        public Version Update_ver
        {
            get { return _Update_ver; }
            set { _Update_ver = value; }
        }

        /// <summary>
        /// 停止更新
        /// </summary>
        public bool CloseUpdate { get; set; }


        /// <summary>
        /// 版本内文件下载状态通知
        /// </summary>
        public event FileDownStatusChangedHandler DownStatuesChange;

        /// <summary>
        /// 版本内文件下载进度通知
        /// </summary>
        public event FileDownProgressChangedHandler DownProgresChange;

        /// <summary>
        /// 版本更新状态通知
        /// </summary>
        public event VersionUpdateStatusChangedHandler VersionStatusChange;

        /// <summary>
        /// 是否有新版本
        /// </summary>
        public event VersionCheckChangedHandler VersionCheckChange;

        /// <summary>
        /// 更新通知
        /// </summary>
        public event ActionEventHandler ActionInfo;




        /// <summary>
        /// 需要更新的版本列表
        /// </summary>
        public Colophon Colophon
        {
            get
            {
                return _Colophon;
            }
            set
            {
                _Colophon = value;
            }
        }

        /// <summary>
        /// 系统配置
        /// </summary>
        private UpdateConfig _Config;

        /// <summary>
        /// 获取或这些系统配置项
        /// </summary>
        public UpdateConfig Config
        {
            get { return _Config; }
            set { _Config = value; }
        }
        #region 构造函数
        public UpdateControl()
        {
            Init();
        }
        public UpdateControl(UpdateConfig config)
        {
            _Config = config;
            Init();
        }

        private void Init()
        { 
            CloseUpdate = false;
            downpro = new Down.DownControl(_Config);
            downpro.DownStatus += new FileDownStatusChangedHandler(downpro_DownStatus);
            downpro.DownProgress += new FileDownProgressChangedHandler(downpro_DownProgress);
            downpro.VersionUpdateStatusChange += new VersionUpdateStatusChangedHandler(downpro_VersionUpdateStatusChange);

            actionControl = new LibUpdate.Action.ActionControl(_Config);
            actionControl.ActionInfo+=new ActionEventHandler(actionControl_ActionInfo);
            actionControl.VersionUpdateStatusChange += new VersionUpdateStatusChangedHandler(downpro_VersionUpdateStatusChange);

        }
        #endregion

        /// <summary>
        /// 检测服务器上是否存在新版本
        /// </summary>
        public  void CheckVersion()
        {
            downpro.Get_Version();
        }

        /// <summary>
        /// 判断是否有新的版本等待更新；
        /// </summary>
        /// <returns></returns>
        private bool ReadServerVersionXml()
        {
            //解读服务器版本信息
            _Colophon = UpdateVerXML.BeginServerReder(_Config.ApplictionPath + Base.UpdatePath + "\\" + Base.ServerVersion);

            //解析客户端版本信息
            Version _Client_ver = UpdateVerXML.XMLtoVersion(_Config.ApplictionPath + "\\" + Base.ClientVersion);
            //判断是否有比当前版本更高的版本
            if (_Colophon.NextVer(_Client_ver).VersionNum > new System.Version("0.0.0.0"))
            {
                //将列表更新为需要升级的版本列表
                _Colophon = _Colophon.NextVerList(_Client_ver.VersionNum);
                return true;
            }
            else
            {
                return false;
            }
        }

        

        /// <summary>
        /// 下载并更新当前系统
        /// </summary>
        public void UpdateSoft()
        {

            if (ReadServerVersionXml())
            {

                UpdateVer(_Colophon[0]);
            }
        }

        /// <summary>
        /// 下载并更新制定定版本
        /// </summary>
        /// <param name="ver"></param>
        public void UpdateVer(Version ver)
        {
            _Update_ver = ver;
           
            if (ver.VersionNum > new System.Version("0.0.0.0"))
            {
                //通知版本开始更新
                if (VersionStatusChange != null)
                {
                    VersionUpdateStatusChangedEvent Versionevent = new VersionUpdateStatusChangedEvent();
                    Versionevent.State = VersionDownState.BegionVersionUpdate;
                    Versionevent.Version = _Update_ver;
                    VersionStatusChange(Versionevent);
                }
                downpro.Update_Ver = _Update_ver;  
          
                downpro.DownVerFile(); 
            }
        }

        /// <summary>
        /// 直接从下载的目录更新制定版本
        /// </summary>
        public void UpdateActionVer()
        {
            if (_Update_ver != null)
            {
                actionControl.Update_Ver = _Update_ver;
                actionControl.UpdateAction();
            }
            else
            {
                throw new Exception("未指定需要更新的版本");
            }

        }



        #region 下载事件处理
        private void downpro_DownStatus(FileDownStatusChangedEvent e)
        {

            if (e.State == FileDownState.End && e.File.Type == FileType.UpdateInfoFile)
            {
                NewVersionEvent();
            }
            else
            {
                if (DownStatuesChange != null)
                {
                    DownStatuesChange(e);
                }
            }
           
        }

        /// <summary>
        /// 版本文件下载完成后，判断是否拥有新版本
        /// </summary>
        /// <param name="e"></param>
        private void NewVersionEvent()
        {
                VersionCheckEventArgs versionCheck = new VersionCheckEventArgs();
                if (ReadServerVersionXml())
                {
                    versionCheck.colophon = _Colophon;
                    versionCheck.NewVersion = true;
                }
                else
                {
                    versionCheck.NewVersion = false;
                }

                if (VersionCheckChange != null)
                {
                    VersionCheckChange(versionCheck);
                }
        }
        
        //下载进度处理
        private void downpro_DownProgress(FileDownProgressChangedEvent e)
        {
            if (DownProgresChange!=null)
            {
                if (e.File.Type != FileType.UpdateInfoFile)
                {
                    DownProgresChange(e);
                }
            }
        }
        #endregion
        
        #region 更新相关事件处理
        //单个文件下载状态处理
        private void actionControl_ActionInfo(ActionEventArgs e)
        {
            if (ActionInfo != null)
            { 
                ActionInfo(e);
            }
        }
        //整个版本更新周期状态处理
        private void downpro_VersionUpdateStatusChange(VersionUpdateStatusChangedEvent e)
        {
            if (VersionStatusChange != null)
            {
                VersionStatusChange(e);
            }
            if (!CloseUpdate)
            {   
                //下载完成，执行更新文件动作
                if (e.State == VersionDownState.EndDown)
                {
                    DownEnd(e);
                }
                //版本更新完成，更新下一个版本
                if (e.State == VersionDownState.EndUpdate)
                {
                    UpdateActionEnd(e);
                }
            }
        }
        //更新完成的处理
        private void UpdateActionEnd(VersionUpdateStatusChangedEvent e)
        {
             SetClicetVer();
            //触发版本升级完全结束通知
            e.State = VersionDownState.EndVersionUpdate;
            if (VersionStatusChange != null)
            {
                VersionStatusChange(e);
            }
            //更新程序需要更新自己，则不需要连续更新程序
            if (Update_ver.UpdateGoal != UpdateGoal.UpdatePro)
            {
                //开始下一个版本更新
                UpdateVer(_Colophon.NextVer(_Update_ver));
            }
        }

        private void DownEnd(VersionUpdateStatusChangedEvent e)
        {
            if (_Update_ver.UpdateGoal == UpdateGoal.MainPro)
            {
                actionControl.Update_Ver = Update_ver;
                actionControl.UpdateAction();
            }
            else if (_Update_ver.UpdateGoal == UpdateGoal.UpdatePro)
            { 
               SetClicetVer();
            }
        }
        #endregion

        /// <summary>
        /// 更新当前客户端版本
        /// </summary>
        public void SetClicetVer()
        {
            UpdateVerXML.SetVersionXml(_Config.ApplictionPath + "\\" + Base.ClientVersion, _Update_ver,_Config.ServerPath);
        }
    }
}
